package LC;

/**
 * @author lhn
 * @date 2024-09-19 11:04
 * 给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
 * 假设 nums 中不等于 val 的元素数量为 k，要通过此题，您需要执行以下操作：
 * 更改 nums 数组，使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
 * 返回 k。
 */

public class RemoveElement {
    public static void main(String[] args) {
        int[] nums1 = new int[]{3,2,2,3};
        System.out.println(removeElement(nums1, 3));
        printArray(nums1);

        int[] nums2 = new int[]{0,1,2,2,3,0,4,2};
        System.out.println(removeElement(nums2, 2));
        printArray(nums2);
    }

    //  看成两部分，一部分是有效的，一部分是无效的，只需要把无效的元素放到数组的末尾，然后返回有效元素的个数即可
    public static int removeElement(int[] nums, int val) {
        int len = nums.length;
        for (int i = 0; i < len; i++) {
            if (nums[i] == val) {
                int temp = nums[i];
                nums[i] = nums[len - 1];
                nums[len - 1] = temp;
                len--;  //有效区域长度-1
                i--;    //因为当前位置的元素是新的元素，继续判断当前位置
            }
        }
        return len;
    }

    public static void printArray(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + " ");
        }
        System.out.println();
    }
}
